package com.example.flow

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
import org.junit.Test


/**
 * 流转换操作符
 * map 将发射元素进行一次转换
 * transform 将发射元素进行任意转换，包括将元素转换为流
 *
 * @author zhouronghua
 * @time 2022/1/7 10:49 下午
 */
class FlowTransformTest {

    /**
     * map将发生元素进行一次转换
     * 说明：将整形元素转换为字符串
     *
     * @author zhouronghua
     * @time 2022/1/7 10:51 下午
     */
    @Test
    fun test_flow_map() = runBlocking {
        (1..3).asFlow().map {
            "我是元素$it"
        }.collect {
            println("收集元素 $it")
        }
    }

    fun requestFlow(i: Int) = flow<String> {
        emit("$i First")
        delay(500)
        emit("$i Second")
    }

    /**
     * transform可以将元素进行任意变换，甚至将元素转换为Flow
     * 说明：将整形元素转换为字符串
     *
     * @author zhouronghua
     * @time 2022/1/7 10:51 下午
     */
    @Test
    fun test_flow_transform() = runBlocking<Unit> {
        (1..3).asFlow()
            .transform { request ->
                emit("开始发生元素$request")
                emit(requestFlow(request))
            }.collect {
                // 接收到的是流对象
                    value -> println("收集元素 $value.")
            }
    }
}